﻿using System;
using System.Text;
using Csla;
using log4net;
using System.ComponentModel.DataAnnotations;
using System.Collections.Generic;

namespace Sireass.Bl
{
    [Serializable]
    public class ProyectoCarreraEdit : BusinessBase<ProyectoCarreraEdit>
    {
        // Create a logger for use in this class
        private static readonly ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        #region Propiedades
        public static readonly PropertyInfo<long> IdProyectoCarreraProperty = RegisterProperty<long>(c => c.IdProyectoCarrera);
        [Display(Name = "Id Proyecto Carrera")]
        public long IdProyectoCarrera
        {
            get { return GetProperty(IdProyectoCarreraProperty); }
            private set { LoadProperty(IdProyectoCarreraProperty, value); }
        }
        
        public static readonly PropertyInfo<long> IdProyectoProperty = RegisterProperty<long>(c => c.IdProyecto);
        [Display(Name = "Id del proyecto")]
        public long IdProyecto
        {
            get { return GetProperty(IdProyectoProperty); }
            set { SetProperty(IdProyectoProperty, value); }
        }

        public static readonly PropertyInfo<long> IdCarreraProperty = RegisterProperty<long>(c => c.IdCarrera);
        [Display(Name = "Id Carrera")]
        public long IdCarrera
        {
            get { return GetProperty(IdCarreraProperty); }
            set { SetProperty(IdCarreraProperty, value); }
        }

        public static readonly PropertyInfo<bool> HabilitadoProperty = RegisterProperty<bool>(c => c.Habilitado);
        [Display(Name = "Habilitado")]
        public bool Habilitado
        {
            get { return GetProperty(HabilitadoProperty); }
            set { SetProperty(HabilitadoProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaAltaProperty = RegisterProperty<DateTime>(c => c.FechaAlta);
        [Display(Name = "Fecha Alta")]
        public DateTime FechaAlta
        {
            get { return GetProperty(FechaAltaProperty); }
            set { SetProperty(FechaAltaProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaBajaProperty = RegisterProperty<DateTime>(c => c.FechaBaja);
        [Display(Name = "Fecha Baja")]
        public DateTime FechaBaja
        {
            get { return GetProperty(FechaBajaProperty); }
            set { SetProperty(FechaBajaProperty, value); }
        }
        #endregion

        #region Factory
        private ProyectoCarreraEdit() { }

        public static void NewProyectoEdit(EventHandler<DataPortalResult<ProyectoCarreraEdit>> callback)
        {
            DataPortal.BeginCreate<ProyectoCarreraEdit>(callback);
        }

        public static ProyectoCarreraEdit NewProyectoEdit()
        {
            return DataPortal.Create<ProyectoCarreraEdit>();
        }

        public static void GetProyectoEdit(long id, EventHandler<DataPortalResult<ProyectoCarreraEdit>> callback)
        {
            DataPortal.BeginFetch<ProyectoCarreraEdit>(id, callback);
        }

        public static ProyectoCarreraEdit GetProyectoEdit(long id)
        {
            return DataPortal.Fetch<ProyectoCarreraEdit>(id);
        }

        public static void DeleteProyectoEdit(long id)
        {
            if (log.IsDebugEnabled)
            {
                log.Debug("DeleteProyectoCarreraEdit->id: " + id);
            }
            DataPortal.Delete<ProyectoCarreraEdit>(id);
        }
        #endregion

        #region Métodos
        public static void AddObjectAuthorizationRules()
        {
            Type type = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType;
            PerfilServicioCriteria criteria = new PerfilServicioCriteria(type.FullName, true);
            PerfilServicioList perfilesPorServicio = PerfilServicioList.GetPerfilServicioList(criteria);
            List<string> roles = new List<string>(perfilesPorServicio.Count);
            foreach (PerfilServicioInfo perfilServicio in perfilesPorServicio)
            {
                roles.Add(perfilServicio.Perfil);
            }
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.CreateObject, roles));
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.GetObject, roles));
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.EditObject, roles));
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.DeleteObject, roles));
        }
        #endregion

        #region Data Portal

        [RunLocal]
        protected override void DataPortal_Create()
        {
            using (BypassPropertyChecks)
            {
                IdProyectoCarrera = -1;
            }
            base.DataPortal_Create();
        }

        private void DataPortal_Fetch(long id)
        {
            using (var dalManager = Sireass.Dal.DalFactory.GetManager())
            {
                var dal = dalManager.GetProvider<Sireass.Dal.IProyectoCarreraDal>();
                using (var data = new Csla.Data.SafeDataReader(dal.Fetch(id)))
                {
                    data.Read();
                    using (BypassPropertyChecks)
                    {

                        IdProyectoCarrera = data.GetInt64("nId_Proyecto_Carrera");
                        IdProyecto = data.GetInt64("nId_Proyecto");
                        IdCarrera = data.GetInt64("nId_Carrera");
                        Habilitado = data.GetBoolean("bHabilitado");
                        FechaAlta = data.GetDateTime("dFecha_Alta");
                        FechaBaja = data.GetDateTime("dFecha_Baja");

                    }
                }
            }
            BusinessRules.CheckRules();
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Insert()
        {
            using (var dalManager = Sireass.Dal.DalFactory.GetManager())
            {
                var dal = dalManager.GetProvider<Sireass.Dal.IProyectoCarreraDal>();
                using (BypassPropertyChecks)
                {
                    IdProyectoCarrera = dal.Insert(IdProyecto,IdCarrera, Habilitado);
                }
            }
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Update()
        {
            using (var dalManager = Sireass.Dal.DalFactory.GetManager())
            {
                var dal = dalManager.GetProvider<Sireass.Dal.IProyectoCarreraDal>();
                using (BypassPropertyChecks)
                {
                    dal.Update(IdProyectoCarrera, IdProyecto, IdCarrera, Habilitado, FechaAlta, FechaBaja);
                }
            }
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_DeleteSelf()
        {
            using (BypassPropertyChecks)
            {
                DataPortal_Delete(IdProyectoCarrera);
            }
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        private void DataPortal_Delete(long id)
        {
            using (var dalManager = Sireass.Dal.DalFactory.GetManager())
            {
                var dal = dalManager.GetProvider<Sireass.Dal.IProyectoCarreraDal>();
                dal.Delete(id);
            }
        }

        protected override void DataPortal_OnDataPortalInvoke(DataPortalEventArgs e)
        {
            // implement your behavior here
            base.DataPortal_OnDataPortalInvoke(e);
        }

        protected override void DataPortal_OnDataPortalInvokeComplete(DataPortalEventArgs e)
        {
            // implement your behavior here
            base.DataPortal_OnDataPortalInvokeComplete(e);
        }

        protected override void Child_OnDataPortalException(DataPortalEventArgs e, Exception ex)
        {
            // implement your behavior here
            base.Child_OnDataPortalException(e, ex);
        }

        #endregion

    }
}
